/**A、B、C、D、E五人在某天夜里合伙去捕鱼，到第二天凌晨时都疲惫不堪，于是各自找到地方睡觉。日上三杆，A第一个醒来，他将🐟分为五份，把多余的一条鱼丢掉，拿走自己的一份。
 * B第二个醒来，也将🐟分为五份，把多余的一条鱼丢掉，拿走自己的一份。C、D、E一次醒来，按照同样方法那鱼。 问他们合伙至少捕了多少条鱼。
 *
 * 分配策略相同。 假定🐟的总数为X， 则  (X-1) 可被5整除， 剩下的鱼位 4*（X-1） / 5。
 */
#include <stdio.h>

int main()
{
    int n, x, flag = 1;
    // 正向思维
    for (n = 6; flag; n += 5)
    {

        for (int i = 1, x = n; flag && (i <= 5); i++)
        {
            if ((x - 1) % 5 == 0)
                x = 4 * (x - 1) / 5;
            else
                flag = 0;
        }

        if (flag)
            break;
        else
            flag = 1;
    }
    printf("Total number of fish catched = %d\n", n);

    // 逆向
    // 设最后一次分配后 F拿走了x条鱼，则在F分配时存在的鱼的个数为:  5 * x + 1 (这也是E拿走的自己的鱼后剩余的个数)，
    // 则 E 分配鱼时的个数为：  (5*X + 1) / 4 * 5   +  1  (同理为D拿走自己鱼后剩余的个数) = D
    // 同理得到 D     (D)*5/4 + 1
    // F(x) = 5/4 * F(x-1)  + 1 ,  F(1) = 5*n + 1 ,  F(x) 为正整数
    int oflag = 1;
    int result = 6;
    for (int x = 1; oflag; x++)
    {
        result = 5 * x + 1;

        for (int i = 0; oflag && i < 4; i++)
        {

            if (result % 4 == 0)
            {
                result = result / 4 * 5 + 1;
            }
            else
            {
                oflag = 0;
            }
        }

        if (oflag)
        {
            printf("F  is %d\n", 5 * x + 1);
            break; // 正常计算4次退出
        }
        else
        {
            // reset
            oflag = 1;
        }
    }

    printf(" The result is %d\n", result);
}